#ifndef AMSNAKE_H
#define AMSNAKE_H

#include <QColor>
#include <QList>
#include <QDebug>
#include <QWidget>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QPainter>
#include <QTimer>
#include <QKeyEvent>
#include <QMessageBox>
#include <QInputDialog>
#include <QObject>



class SnakeNode
{
public:
    int x, y;			//坐标
    QColor color;		//颜色

    SnakeNode();
    SnakeNode(int x, int y, QColor color = Qt::red);

    bool operator ==(const SnakeNode &other) const;
    bool operator !=(const SnakeNode &other) const;
};

class AutoSnake
{
public:
    enum Move{Left = 0, Right, Up, Down};
    const qint8 dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

    QList<SnakeNode> snake;		//蛇
    SnakeNode *food;			//食物
    int sideLen;				//边长
    int stepLen;				//步长
    bool **pathBoard;			//点是否在环路上
    qint8 **path;				//每个点上的移动方向，存储L,R,D,U
    bool **board;

    AutoSnake(int sideLen = 16, int stepLen = 20);
    ~AutoSnake();
    void init();									//初始化
    void createFood();								//创建食物
    void forward(SnakeNode &node, bool isEatFood);	//蛇前进
    int move();										//蛇移动
    void setPathBoard(SnakeNode x, bool t);			//一次性将一个环添加或删除时，修改path_board
    bool matrixNoPoint(SnakeNode x);				//某一极小环路是否存在蛇的身体，不存在的环路要拆除
    bool pathBoardNotAllTrue(SnakeNode x);			//两个极小环路相接的环路是否一个在路径里，一个在路径外，这是可添加路径的判断依据
    void addPathMatrix(SnakeNode x);				//添加路径
    void checkIfDel(SnakeNode x);					//判断是否为可剪除的环路
    void delPathMatrix(SnakeNode x);				//
    void formPath();								//路径生成
    void delPath();									//路径删除
    bool isNotAllTrue(bool **tmp);					//不全为true
    bool isValidPoint(SnakeNode tmp);				//
    void setBoardTrue(SnakeNode X);					//设该点为true
    void setBoardFalse(SnakeNode X);				//设该点为false
};

namespace Ui {
class AMSnake;
}

class AMSnake : public QWidget
{
    Q_OBJECT

public:
    explicit AMSnake(QWidget *parent = nullptr);
    ~AMSnake();

    void initGame();						//游戏初始化
    void paintEvent(QPaintEvent *event);	//绘制游戏界面
    void initSnake();						//蛇身初始化
    void createFood();						//随机出现食物
    void endGame();							//游戏结束
    void keyReleaseEvent(QKeyEvent *event);	//按键按下事件
    bool play();							//开始游戏

private slots:
    //蛇移动
    void snakeMove();
    //是否静音
    void on_soundOnOffCheckBox_stateChanged(int arg1);

signals:
    void showMainWindow();

private:
    Ui::AMSnake *ui;

    //游戏参数声明
    int score;					//金币
    int add;					//单价
    int grade;					//难度等级
    int sleeptime;				//每次运行的时间间隔
    int endGamestatus;			//游戏结束的情况，-2:未开始; -1:暂停; 0:正常; 1:撞到墙; 2:咬到自己; 3:主动退出游戏; 5:吃满全屏，游戏胜利
    int status;					//蛇的状态
    int mapLength;				//地图的边长
    int mapSize;				//地图每一块的大小

    //游戏资源声明
    QImage jinbi;				//金币图片
    QMediaPlaylist *bgPlaylist;	//加载背景音乐
    QMediaPlayer *bgPlayer;		//背景音乐播放
    QMediaPlaylist *jbPlaylist;	//加载金币音效
    QMediaPlayer *jbPlayer;		//金币音效播放
    QMediaPlaylist *swPlaylist;	//加载死亡音效
    QMediaPlayer *swPlayer;		//死亡音效播放
    qint64 bgPlayPos;			//背景音乐播放进度

    //游戏功能类型声明
    QTimer *timer;				//定时器
    QMessageBox msgBox;			//消息对话框
    AutoSnake *snake;			//蛇指针
    QColor  getColor();
};




#endif // AMSNAKE_H
